# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Docker container containing various hardware and software development tools
# for OpenTitan.

# Global configuration options.
ARG VERILATOR_VERSION=4.104

# The RISCV toolchain version should match the release tag used in GitHub.
ARG RISCV_TOOLCHAIN_TAR_VERSION=20210412-1

# Build OpenOCD
# OpenOCD is a tool to connect with the target chip over JTAG and similar
# transports.
FROM ubuntu:18.04 AS openocd
RUN apt-get update && apt-get install -y \
    autoconf \
    git \
    libftdi1-dev \
    libtool \
    libusb-1.0.0-dev \
    pkg-config \
    texinfo
RUN git clone --depth=1 https://github.com/riscv/riscv-openocd.git /usr/local/src/openocd
RUN cd /usr/local/src/openocd && ./bootstrap && mkdir build && cd build && \
    ../configure --enable-ftdi --enable-verbose-jtag-io --disable-vsllink \
    --enable-remote-bitbang --prefix=/tools/openocd && \
    make -j$(nproc) && make install

# Build Verilator.
FROM ubuntu:18.04 as verilator
ARG VERILATOR_VERSION
RUN apt-get update && apt-get install -y \
    autoconf \
    automake \
    autotools-dev \
    bison \
    build-essential \
    flex \
    git
RUN git clone --depth=1 -b  v${VERILATOR_VERSION} \
    https://github.com/verilator/verilator.git /usr/local/src/verilator
RUN cd /usr/local/src/verilator && \
    autoconf && ./configure --prefix=/tools/verilator/${VERILATOR_VERSION} && \
    make -j$(nproc) && make install


# Main container image.
FROM ubuntu:18.04 AS opentitan
ARG VERILATOR_VERSION
ARG RISCV_TOOLCHAIN_TAR_VERSION

LABEL version="1.0"
LABEL description="OpenTitan container for hardware development."
LABEL maintainer="miguelosorio@google.com"

# Copy tools from previous build stages
WORKDIR /tools
COPY --from=openocd /tools/openocd openocd
COPY --from=verilator /tools/verilator/${VERILATOR_VERSION} verilator/${VERILATOR_VERSION}

# Install (and cleanup) required packages (from apt-requirements.txt)
# The list of extra packages is leftover from before this Dockerfile used
# apt-requirements.txt
#
# This also adds `locales` and `locales-all` so we can set the locale to utf-8
COPY apt-requirements.txt /tmp/apt-requirements.txt
RUN apt-get update && \
    sed 's/#.*//' /tmp/apt-requirements.txt \
        | xargs apt-get install -y && \
    apt-get install -y \
        locales \
        locales-all \
        gnupg2 \
        libc6-i386 \
        libtool \
        minicom \
        screen && \
    apt-get clean ; \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

# Set Locale to utf-8 everywhere
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en

# Copy repository into tmp directory to execute additional install steps.
COPY python-requirements.txt /tmp/python-requirements.txt
RUN pip3 install -r /tmp/python-requirements.txt

COPY util/get-toolchain.py /tmp/get-toolchain.py
RUN /tmp/get-toolchain.py -r ${RISCV_TOOLCHAIN_TAR_VERSION}
RUN rm /tmp/python-requirements.txt /tmp/get-toolchain.py

# Use bash as default shell
RUN ln -sf /bin/bash /bin/sh

# Include tools in PATH.
ENV PATH "/tools/verilator/${VERILATOR_VERSION}/bin:${PATH}"

# Configures default container user.
ENV USER ot

ENTRYPOINT /bin/bash
